package org.cloud.jiangyougateway.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtTokenUtils {

    //用于签名的私钥
    private static final String PRIVATE_KEY = "JiangYou_Private_Key";
    //签发者
    private static final String ISS = "JiangYou_Admin";

    //过期时间1小时
    private static final long EXPIRATION_ONE_HOUR = 3600L;
    //过期时间1天
    private static final long EXPIRATION_ONE_DAY = 604800L;

    /**
     * 生成Token
     *
     * @param 
     * @return
     */
    public static String createToken(String userId, String account) {
        //Jwt头
        Map<String, Object> header = new HashMap<>();
        header.put("typ", "JWT");
        header.put("alg", "HS256");
        Map<String, Object> claims = new HashMap<>();
        //自定义有效载荷部分
        claims.put("id", userId);
        claims.put("account", account);
//        claims.put("type", type);

        return Jwts.builder()
                //发证人
                .setIssuer(ISS)
                //Jwt头
                .setHeader(header)
                //有效载荷
                .setClaims(claims)
                //设定签发时间
                .setIssuedAt(new Date())
                //设定过期时间
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_ONE_HOUR * 1000))
                //使用HS256算法签名，PRIVATE_KEY为签名密钥
                .signWith(SignatureAlgorithm.HS256, PRIVATE_KEY)
                .compact();
    }

    /**
     * 验证Token，返回数据只有id和account和type的User对象
     *
     * @param token
     * @return
     */
    public static Boolean checkToken(String token) {
        //解析token后，从有效载荷取出值
        String account = (String) getClaimsFromToken(token).get("account");
        return account != null;
    }


    public static Boolean isTokenExpired(String token) {
        // 获取 token 失效时间，本类内新建此方法
        Date expireDate = getExpiredDateFromToken(token);
        // 如果 token 过期时间在当前时间前面，有效
        return expireDate.before(new Date());
    }

    private static Date getExpiredDateFromToken(String token) {
        // 根据 token 获取荷载
        Claims claims = getClaimsFromToken(token);
        // 从荷载中获取过期时间
        assert claims != null;
        return claims.getExpiration();
    }

    /**
     * 获取有效载荷
     *
     * @param token
     * @return
     */
    public static Claims getClaimsFromToken(String token) {
        Claims claims = null;
        try {
            claims = Jwts.parser()
                    //设定解密私钥
                    .setSigningKey(PRIVATE_KEY)
                    //传入Token
                    .parseClaimsJws(token)
                    //获取载荷类
                    .getBody();
        } catch (Exception e) {
            return null;
        }
        return claims;
    }

}
